home *** CD-ROM | disk | FTP | other *** search
/ Dynamic HTML Construction Kit / Dynamic HTML Construction Kit.iso / earthlink / nscomm / java40.jar / sun / awt / image / InputStreamImageSource.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-11-03  |  6.2 KB  |  509 lines

  1. package sun.awt.image;
  2.  
  3. import java.awt.image.ColorModel;
  4. import java.awt.image.ImageConsumer;
  5. import java.awt.image.ImageProducer;
  6. import java.io.BufferedInputStream;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.util.Hashtable;
  10.  
  11. public abstract class InputStreamImageSource implements ImageProducer, ImageFetchable {
  12.    PixelStore pixelstore;
  13.    private ConsumerQueue consumers;
  14.    private boolean awaitingFetch = false;
  15.    private Thread latestFetcher;
  16.    private ImageDecoder decoder;
  17.  
  18.    abstract boolean checkSecurity(Object var1, boolean var2);
  19.  
  20.    synchronized int countConsumers() {
  21.       ConsumerQueue var1 = this.consumers;
  22.  
  23.       int var2;
  24.       for(var2 = 0; var1 != null; var1 = var1.next) {
  25.          ++var2;
  26.       }
  27.  
  28.       return var2;
  29.    }
  30.  
  31.    public void addConsumer(ImageConsumer var1) {
  32.       this.addConsumer(var1, false);
  33.    }
  34.  
  35.    synchronized void addConsumer(ImageConsumer var1, boolean var2) {
  36.       this.checkSecurity((Object)null, false);
  37.  
  38.       ConsumerQueue var3;
  39.       for(var3 = this.consumers; var3 != null && var3.consumer != var1; var3 = var3.next) {
  40.       }
  41.  
  42.       if (var3 == null) {
  43.          var3 = new ConsumerQueue(this, var1);
  44.          var3.next = this.consumers;
  45.          this.consumers = var3;
  46.       } else {
  47.          if (!var3.secure) {
  48.             Object var4 = null;
  49.             SecurityManager var5 = System.getSecurityManager();
  50.             if (var5 != null) {
  51.                var4 = var5.getSecurityContext();
  52.             }
  53.  
  54.             if (var3.securityContext == null) {
  55.                var3.securityContext = var4;
  56.             } else if (var3.securityContext != var4) {
  57.                this.errorConsumer(var3);
  58.                throw new SecurityException("Applets are trading image data!");
  59.             }
  60.          }
  61.  
  62.          var3.interested = true;
  63.       }
  64.  
  65.       if (var2 && var3.feeder == null && !this.awaitingFetch) {
  66.          this.startProduction();
  67.       }
  68.  
  69.    }
  70.  
  71.    public synchronized boolean isConsumer(ImageConsumer var1) {
  72.       for(ConsumerQueue var2 = this.consumers; var2 != null; var2 = var2.next) {
  73.          if (var2.consumer == var1) {
  74.             return true;
  75.          }
  76.       }
  77.  
  78.       return false;
  79.    }
  80.  
  81.    synchronized void errorConsumer(ConsumerQueue var1) {
  82.       var1.consumer.imageComplete(1);
  83.       this.removeConsumer(var1.consumer);
  84.    }
  85.  
  86.    public synchronized void removeConsumer(ImageConsumer var1) {
  87.       ConsumerQueue var2 = this.consumers;
  88.  
  89.       for(ConsumerQueue var3 = null; var2 != null; var2 = var2.next) {
  90.          if (var2.consumer == var1) {
  91.             if (var3 == null) {
  92.                this.consumers = var2.next;
  93.             } else {
  94.                var3.next = var2.next;
  95.             }
  96.  
  97.             var2.interested = false;
  98.             return;
  99.          }
  100.  
  101.          var3 = var2;
  102.       }
  103.  
  104.    }
  105.  
  106.    public void startProduction(ImageConsumer var1) {
  107.       this.addConsumer(var1, true);
  108.    }
  109.  
  110.    private synchronized void startProduction() {
  111.       if (!this.awaitingFetch) {
  112.          ImageFetcher.add(this);
  113.          this.awaitingFetch = true;
  114.       }
  115.  
  116.    }
  117.  
  118.    public void requestTopDownLeftRightResend(ImageConsumer var1) {
  119.       synchronized(this){}
  120.  
  121.       PixelStore var2;
  122.       try {
  123.          var2 = this.pixelstore;
  124.       } catch (Throwable var5) {
  125.          throw var5;
  126.       }
  127.  
  128.       if (var2 != null) {
  129.          var2.replay(this, var1, false);
  130.       }
  131.  
  132.    }
  133.  
  134.    protected abstract ImageDecoder getDecoder();
  135.  
  136.    protected ImageDecoder decoderForType(InputStream var1, String var2) {
  137.       return null;
  138.    }
  139.  
  140.    protected ImageDecoder getDecoder(InputStream var1) {
  141.       if (!((InputStream)var1).markSupported()) {
  142.          var1 = new BufferedInputStream((InputStream)var1);
  143.       }
  144.  
  145.       try {
  146.          ((InputStream)var1).mark(6);
  147.          int var2 = ((InputStream)var1).read();
  148.          int var3 = ((InputStream)var1).read();
  149.          int var4 = ((InputStream)var1).read();
  150.          int var5 = ((InputStream)var1).read();
  151.          ((InputStream)var1).read();
  152.          ((InputStream)var1).read();
  153.          ((InputStream)var1).reset();
  154.          ((InputStream)var1).mark(-1);
  155.          if (var2 == 71 && var3 == 73 && var4 == 70 && var5 == 56) {
  156.             return new GifImageDecoder(this, (InputStream)var1);
  157.          }
  158.  
  159.          if (var2 == 255 && var3 == 216 && var4 == 255) {
  160.             return new JPEGImageDecoder(this, (InputStream)var1);
  161.          }
  162.  
  163.          if (var2 == 35 && var3 == 100 && var4 == 101 && var5 == 102) {
  164.             return new XbmImageDecoder(this, (InputStream)var1);
  165.          }
  166.       } catch (IOException var6) {
  167.       }
  168.  
  169.       return null;
  170.    }
  171.  
  172.    public void doFetch() {
  173.       Thread var1 = Thread.currentThread();
  174.       ImageDecoder var2 = null;
  175.  
  176.       try {
  177.          if (this.latchConsumers(var1) <= 0) {
  178.             return;
  179.          }
  180.  
  181.          if (!this.updateFromStore(var1)) {
  182.             var2 = this.getDecoder();
  183.             if (var2 != null) {
  184.                this.setDecoder(var2, var1);
  185.  
  186.                try {
  187.                   var2.produceImage();
  188.                } catch (IOException var30) {
  189.                   ((Throwable)var30).printStackTrace();
  190.                } catch (ImageFormatException var31) {
  191.                   ((Throwable)var31).printStackTrace();
  192.                }
  193.  
  194.                return;
  195.             }
  196.  
  197.             return;
  198.          }
  199.       } finally {
  200.          synchronized(this){}
  201.  
  202.          try {
  203.             if (this.latestFetcher == var1) {
  204.                this.latestFetcher = null;
  205.                this.decoder = null;
  206.             }
  207.          } catch (Throwable var32) {
  208.             throw var32;
  209.          }
  210.  
  211.          this.imageComplete(1);
  212.          this.unlatchConsumers(var2, var1);
  213.       }
  214.  
  215.    }
  216.  
  217.    private boolean updateFromStore(Thread var1) {
  218.       synchronized(this){}
  219.  
  220.       PixelStore var2;
  221.       ConsumerQueue var3;
  222.       try {
  223.          var2 = this.pixelstore;
  224.          if (var2 == null) {
  225.             boolean var4 = false;
  226.             return var4;
  227.          }
  228.  
  229.          var3 = this.consumers;
  230.       } catch (Throwable var18) {
  231.          throw var18;
  232.       }
  233.  
  234.       while(var3 != null) {
  235.          synchronized(this){}
  236.  
  237.          try {
  238.             if (var3.feeder == null) {
  239.                if (!this.checkSecurity(var3.securityContext, true)) {
  240.                   this.errorConsumer(var3);
  241.                } else {
  242.                   var3.feeder = var1;
  243.                }
  244.             }
  245.  
  246.             if (var3.feeder != var1) {
  247.                var3 = var3.next;
  248.                continue;
  249.             }
  250.          } catch (Throwable var17) {
  251.             throw var17;
  252.          }
  253.  
  254.          if (!var2.replay(this, var3.consumer)) {
  255.             return false;
  256.          }
  257.  
  258.          synchronized(this){}
  259.  
  260.          try {
  261.             var3 = var3.next;
  262.          } catch (Throwable var16) {
  263.             throw var16;
  264.          }
  265.       }
  266.  
  267.       return true;
  268.    }
  269.  
  270.    private synchronized void setDecoder(ImageDecoder var1, Thread var2) {
  271.       for(ConsumerQueue var3 = this.consumers; var3 != null; var3 = var3.next) {
  272.          if (var3.feeder == var2) {
  273.             if (!this.checkSecurity(var3.securityContext, true)) {
  274.                this.errorConsumer(var3);
  275.             } else {
  276.                var3.decoder = var1;
  277.             }
  278.          }
  279.       }
  280.  
  281.       if (this.latestFetcher == var2) {
  282.          this.decoder = var1;
  283.       }
  284.  
  285.    }
  286.  
  287.    private synchronized int latchConsumers(Thread var1) {
  288.       this.latestFetcher = var1;
  289.       this.awaitingFetch = false;
  290.       ConsumerQueue var2 = this.consumers;
  291.  
  292.       int var3;
  293.       for(var3 = 0; var2 != null; var2 = var2.next) {
  294.          if (var2.feeder == null) {
  295.             if (!this.checkSecurity(var2.securityContext, true)) {
  296.                this.errorConsumer(var2);
  297.             } else {
  298.                var2.feeder = var1;
  299.                ++var3;
  300.             }
  301.          }
  302.       }
  303.  
  304.       return var3;
  305.    }
  306.  
  307.    private synchronized void unlatchConsumers(ImageDecoder var1, Thread var2) {
  308.       ConsumerQueue var3 = this.consumers;
  309.  
  310.       for(ConsumerQueue var4 = null; var3 != null; var3 = var3.next) {
  311.          if (var3.feeder == var2) {
  312.             if (var4 == null) {
  313.                this.consumers = var3.next;
  314.             } else {
  315.                var4.next = var3.next;
  316.             }
  317.          } else {
  318.             if (var3.feeder == null) {
  319.                this.startProduction();
  320.             }
  321.  
  322.             var4 = var3;
  323.          }
  324.       }
  325.  
  326.    }
  327.  
  328.    private ConsumerQueue nextConsumer(ConsumerQueue var1, Thread var2) {
  329.       ImageDecoder var3 = null;
  330.       synchronized(this){}
  331.  
  332.       try {
  333.          for(var1 = var1 == null ? this.consumers : var1.next; var1 != null; var1 = var1.next) {
  334.             if (var1.interested) {
  335.                if (var1.feeder == var2) {
  336.                   ConsumerQueue var4 = var1;
  337.                   return var4;
  338.                }
  339.  
  340.                if (var1.feeder == null && this.latestFetcher == var2) {
  341.                   var3 = this.decoder;
  342.                   break;
  343.                }
  344.             }
  345.          }
  346.       } catch (Throwable var18) {
  347.          throw var18;
  348.       }
  349.  
  350.       if (var1 != null) {
  351.          if (var3 != null && var3.catchupConsumer(this, var1.consumer)) {
  352.             synchronized(this){}
  353.  
  354.             try {
  355.                if (var1.interested) {
  356.                   if (this.checkSecurity(var1.securityContext, true)) {
  357.                      var1.feeder = var2;
  358.                      var1.decoder = var3;
  359.                      ConsumerQueue var20 = var1;
  360.                      return var20;
  361.                   }
  362.  
  363.                   this.errorConsumer(var1);
  364.                }
  365.             } catch (Throwable var17) {
  366.                throw var17;
  367.             }
  368.          } else {
  369.             synchronized(this){}
  370.  
  371.             try {
  372.                if (this.latestFetcher == var2) {
  373.                   this.latestFetcher = null;
  374.                   this.decoder = null;
  375.                }
  376.  
  377.                this.startProduction();
  378.             } catch (Throwable var16) {
  379.                throw var16;
  380.             }
  381.          }
  382.  
  383.          var1 = this.nextConsumer(var1, var2);
  384.       }
  385.  
  386.       return var1;
  387.    }
  388.  
  389.    synchronized void flush() {
  390.       ConsumerQueue var1 = this.consumers;
  391.  
  392.       for(this.consumers = null; var1 != null; var1 = var1.next) {
  393.          var1.interested = false;
  394.  
  395.          try {
  396.             if (var1.feeder != null) {
  397.                var1.feeder.interrupt();
  398.             }
  399.          } catch (NoSuchMethodError var2) {
  400.             break;
  401.          }
  402.  
  403.          if (var1.decoder != null) {
  404.             var1.decoder.close();
  405.          }
  406.       }
  407.  
  408.       this.pixelstore = null;
  409.    }
  410.  
  411.    synchronized void setPixelStore(PixelStore var1) {
  412.       this.pixelstore = var1;
  413.    }
  414.  
  415.    int setDimensions(int var1, int var2) {
  416.       ConsumerQueue var3 = null;
  417.       Thread var4 = Thread.currentThread();
  418.  
  419.       int var5;
  420.       for(var5 = 0; (var3 = this.nextConsumer(var3, var4)) != null; ++var5) {
  421.          var3.consumer.setDimensions(var1, var2);
  422.       }
  423.  
  424.       return var5;
  425.    }
  426.  
  427.    int setProperties(Hashtable var1) {
  428.       ConsumerQueue var2 = null;
  429.       Thread var3 = Thread.currentThread();
  430.  
  431.       int var4;
  432.       for(var4 = 0; (var2 = this.nextConsumer(var2, var3)) != null; ++var4) {
  433.          var2.consumer.setProperties(var1);
  434.       }
  435.  
  436.       return var4;
  437.    }
  438.  
  439.    int setColorModel(ColorModel var1) {
  440.       ConsumerQueue var2 = null;
  441.       Thread var3 = Thread.currentThread();
  442.  
  443.       int var4;
  444.       for(var4 = 0; (var2 = this.nextConsumer(var2, var3)) != null; ++var4) {
  445.          var2.consumer.setColorModel(var1);
  446.       }
  447.  
  448.       return var4;
  449.    }
  450.  
  451.    int setHints(int var1) {
  452.       ConsumerQueue var2 = null;
  453.       Thread var3 = Thread.currentThread();
  454.  
  455.       int var4;
  456.       for(var4 = 0; (var2 = this.nextConsumer(var2, var3)) != null; ++var4) {
  457.          var2.consumer.setHints(var1);
  458.       }
  459.  
  460.       return var4;
  461.    }
  462.  
  463.    int setPixels(int var1, int var2, int var3, int var4, ColorModel var5, byte[] var6, int var7, int var8) {
  464.       ConsumerQueue var9 = null;
  465.       Thread var10 = Thread.currentThread();
  466.       if (var10.getPriority() > 4) {
  467.          SecurityManager.enablePrivilege("UniversalThreadAccess");
  468.          var10.setPriority(4);
  469.          SecurityManager.revertPrivilege();
  470.       }
  471.  
  472.       int var11;
  473.       for(var11 = 0; (var9 = this.nextConsumer(var9, var10)) != null; ++var11) {
  474.          var9.consumer.setPixels(var1, var2, var3, var4, var5, var6, var7, var8);
  475.       }
  476.  
  477.       return var11;
  478.    }
  479.  
  480.    int setPixels(int var1, int var2, int var3, int var4, ColorModel var5, int[] var6, int var7, int var8) {
  481.       ConsumerQueue var9 = null;
  482.       Thread var10 = Thread.currentThread();
  483.       if (var10.getPriority() > 4) {
  484.          SecurityManager.enablePrivilege("UniversalThreadAccess");
  485.          var10.setPriority(4);
  486.          SecurityManager.revertPrivilege();
  487.       }
  488.  
  489.       int var11;
  490.       for(var11 = 0; (var9 = this.nextConsumer(var9, var10)) != null; ++var11) {
  491.          var9.consumer.setPixels(var1, var2, var3, var4, var5, var6, var7, var8);
  492.       }
  493.  
  494.       return var11;
  495.    }
  496.  
  497.    int imageComplete(int var1) {
  498.       ConsumerQueue var2 = null;
  499.       Thread var3 = Thread.currentThread();
  500.  
  501.       int var4;
  502.       for(var4 = 0; (var2 = this.nextConsumer(var2, var3)) != null; ++var4) {
  503.          var2.consumer.imageComplete(var1);
  504.       }
  505.  
  506.       return var4;
  507.    }
  508. }
  509.